import api.BenchmarkFactory;
import api.BenchmarkModule;
import api.Configuration;
import api.result.Result;
import com.google.gson.Gson;

import java.io.InputStream;
import java.io.InputStreamReader;

/***
 * 如想了解整个项目框架，可参考以下顺序查看文档
 * api.Configuration
 * api.BenchmarkModule
 * api.Loader
 * api.Terminal
 * api.Worker
 *
 * 负责各个数据库的同学需要完成的地方有三个，以TPC-H的MongoDB为例，其他的也类似：
 * 1）在（2）、（3）中可以看到在数据装载及执行查询时需传入一个DBConnection，每个数据库Driver都有类似Connection或
 *   Client的东西，通过这个Connection或Client来执行不同的查询。这里的DBConnection只是个接口，
 *   实际传入的是一个api.connection.ConnectionMongo具体实现根据不同的数据库自己实现，
 *   比如MongoDB则需要在api/connection/ConnectionMongo中继承相应的Connection或Client，并重载所需要的方法以满足后续的数据库操作。
 * 2）benchmarks.tpch.mongo.TPCHLoaderMongo中loadData(DBConnection connection)方法，
 *   该方法用于根据scaleFactor初始化Mongo并装载数据，返回结果null即可。
 * 3）benchmarks.tpch.mongo.queries.Q1Mongo及其他5个Query中run(DBConnection connection)方法，
 *   该方法用于执行指定的Query语句（对应TPC-C中的Transaction），返回结果null即可。
 * PS：测试时可以调整config.json以测试相应的模块，也可直接编写独立的测试单元。
 */
public class Workload {
    public static void main(String[] args) {
        InputStream configStream = Workload.class.getClassLoader().getResourceAsStream("config.json");
        Configuration config = new Gson().fromJson(new InputStreamReader(configStream), Configuration.class);
        BenchmarkModule benchmark = null;
        try {
            benchmark = new BenchmarkFactory().createBenchmark(config);

        } catch (BenchmarkFactory.UndefinedConfigException e) {
            throw new RuntimeException(e);
        }
        Result r1 = benchmark.loadData();
        Result r2 = benchmark.runBenchmark();
        r2.union(r1).show();
    }
}
